/*
    文件内容: Channel类,处理Epoll中的数据
    文件名: Channel.cpp
    作者: 中国好青年(码农论坛)
    时间: 2024/9/6
*/
#include "Channel.h"

/* 
    函数名: Channel(Epoll* ep, int fd, bool islisten)
    返回值: 无
    参  数: Epoll* ep, epoll树的实例; int fd, 需要添加到书上的文件描述符;
    函数作用: 构造函数,关闭epoll监听实例
*/
Channel::Channel(EventLoop* loop, int fd):loop_(loop),fd_(fd)
{

}

/* 
    函数名: ~Channel()
    返回值: 无
    参  数: 无
    函数作用: 析构函数
*/
Channel::~Channel()
{
    
}

/* 
    函数名: fd()
    返回值: 当前Channel维护的fd
    参  数: 无
    函数作用: 返回当前Channel维护的fd
*/
int Channel::fd()
{
    return fd_;
}

/* 
    函数名: enableEt()
    返回值: 无
    参  数: 无
    函数作用: 开启当前Channel维护的fd,在epoll树中的边缘触发事件
*/
void Channel::enableEt()
{
    events_ |= EPOLLET;
}

/* 
    函数名: enableReadEvent()
    返回值: 无
    参  数: 无
    函数作用: 开启当前Channel维护的fd,开启epoll树中的读事件
*/
void Channel::enableReadEvent()
{
    events_ |= EPOLLIN;
    loop_->updateChannel(this);
}

/* 
    函数名: enableReadEvent()
    返回值: 无
    参  数: 无
    函数作用: 开启当前Channel维护的fd,关闭epoll树中的读事件
*/
void Channel::disableReadEvent()
{
    events_ &= ~EPOLLIN;
    loop_->updateChannel(this);
}

/* 
    函数名: enableReadEvent()
    返回值: 无
    参  数: 无
    函数作用: 开启当前Channel维护的fd,开启epoll树中的写事件
*/
void Channel::enableWriteEvent()
{
    events_ |= EPOLLOUT;
    loop_->updateChannel(this);
}

/* 
    函数名: enableReadEvent()
    返回值: 无
    参  数: 无
    函数作用: 开启当前Channel维护的fd,关闭epoll树中的写事件
*/
void Channel::disableWriteEvent()
{
    events_ &= ~EPOLLOUT;
    loop_->updateChannel(this);
}

void Channel::disableall()
{
    events_ = 0;
    loop_->updateChannel(this);
}

void Channel::remove()
{
    disableall();
    loop_ -> removeChannel(this);
}

/* 
    函数名: enableInepoll()
    返回值: 无
    参  数: 无
    函数作用: 设置Channel维护的inepoll_为true,表示fd_在ep_树上
*/
void Channel::enableInepoll()
{
    inepoll_ = true;
}

/* 
    函数名: setRevents()
    返回值: 无
    参  数: 无
    函数作用: 设置Channel维护的revents_为ev,存储epoll返回fd相关的事件
*/
void Channel::setRevents(uint32_t ev)
{
    revents_ = ev;
}

/* 
    函数名: setReadCallback()
    返回值: 无
    参  数: 与readcallback_相同的参数
    函数作用: 设置Channel中的readcallback_的值,设置回调函数
*/
void Channel::setReadCallback(std::function<void()> readcallback)
{   
    readcallback_ = readcallback;
}

/* 
    函数名: setCloseCallback(std::function<void()> closecallback)
    返回值: 无
    参  数: connection对象中的closecallback函数
    函数作用: 在创建Channel调用,由Connection对象创建时赋值
*/
void Channel::setCloseCallback(std::function<void()> closecallback)
{
    closecallback_ = closecallback;
}

/* 
    函数名: setErrorCallback(std::function<void()> errorcallback)
    返回值: 无
    参  数: connection对象中的errorcallback函数
    函数作用: 在创建Channel调用,由Connection对象创建时赋值
*/
void Channel::setErrorCallback(std::function<void()> errorcallback)
{
    errorcallback_ = errorcallback;
}

/* 
    函数名: setWriteCallback(std::function<void()> writecallback)
    返回值: 无
    参  数: connection对象中的writecallback函数
    函数作用: 在创建Channel调用,由Connection对象创建时赋值
*/
void Channel::setWriteCallback(std::function<void()> writecallback)
{
    writecallback_ = writecallback;
}

/* 
    函数名: inepoll()
    返回值: Channel中inepoll_成员值
    参  数: 无
    函数作用: 返回Channel中inepoll_成员值
*/
bool Channel::inepoll()
{
    return inepoll_;
}

/* 
    函数名: events()
    返回值: Channel中events_成员值
    参  数: 无
    函数作用: 返回Channel中events_成员值,表示ep_维护的该fd_的事件
*/
uint32_t Channel::events()
{
    return events_;
}

/* 
    函数名: events()
    返回值: Channel中revents成员值
    参  数: 无
    函数作用: 返回Channel中revents_成员值,表示ep_维护的触发该fd_事件
*/
uint32_t Channel::revents()
{
    return revents_;
}

/* 
    函数名: handleEvents()
    返回值: 无
    参  数: 无
    函数作用: 处理主流程的epoll_wait之后的操作
*/
void Channel::handleEvents()
{
    if(revents_ & EPOLLRDHUP)
    {   
        //关闭事件
        if(closecallback_)
            closecallback_();
    }
    else if(revents_ & (EPOLLIN|EPOLLPRI))
    {   
        //读事件
        if(readcallback_)
            readcallback_();
    }
    else if(revents_ & EPOLLOUT)
    {      
        //写事件
        if(writecallback_)
            writecallback_();
    }
    else
    {   
        //其他事件, 按错误处理
        if(errorcallback_)
            errorcallback_();
    }
}

